package ${package.common}.base;

import lombok.*;

import java.util.List;
import java.util.function.Function;

import static ${package.common}.exception.ExceptionCode.INTERNAL_SERVER_ERROR;
import static ${package.common}.exception.ExceptionCode.OK;

/**
 * 分页API响应
 *
 * @author ${author}
 * @since ${date}
 */
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class ApiPageResponse<T> {


    /**
     * 错误码
     */
    private int code;


    /**
     * 错误消息
     */
    private String message;


    /**
     * 响应数据
     */
    private PageResponse<T> data;




    /**
     * 成功
     *
     * @return true:成功;false:失败
     */
    public boolean isSuccess() {
        return code == 200;
    }


    /**
     * 成功
     *
     * @param pagination 分页信息
     * @param data       数据
     * @param <T>        数据类型
     * @return 自定义数据的响应
     */
    public static <T> ApiPageResponse<T> ok(Pagination pagination, List<T> data) {
        return new ApiPageResponse<>(OK.getCode(), OK.getMessage(), new PageResponse<>(pagination, data));
    }



    /**
     * 失败
     *
     * @return 无数据的响应
     */
    public static <T> ApiPageResponse<T> fail() {
        return fail(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMessage());
    }


    /**
     * 失败
     *
     * @param message 错误消息
     * @return 无数据的响应
     */
    public static <T> ApiPageResponse<T> fail(String message) {
        return fail(INTERNAL_SERVER_ERROR.getCode(), message);
    }




    /**
     * 失败
     *
     * @param code    错误码
     * @param message 错误消息
     * @return 无数据的响应
     */
    public static <T> ApiPageResponse<T> fail(int code, String message) {
        return new ApiPageResponse<>(code, message, null);
    }


    /**
     * 领域响应转响应数据
     *
     * @param domainPageResponse 领域响应
     * @param <T>                API分页响应数据类型
     * @return 响应数据
     */
    public static <T> ApiPageResponse<T> valueOf(DomainPageResponse<T> domainPageResponse) {
        return new ApiPageResponse<>(domainPageResponse.getCode(), domainPageResponse.getMessage(), domainPageResponse.getData());
    }


    /**
     * 领域响应转响应数据
     *
     * @param domainPageResponse 领域响应
     * @param func               转换函数
     * @param <E>                领域响应类型
     * @param <T>                API分页响应数据类型
     * @return 响应数据
     */
    public static <E, T> ApiPageResponse<T> valueOf(DomainPageResponse<E> domainPageResponse,
                                                    Function<PageResponse<E>,  PageResponse<T>> func) {
        return new ApiPageResponse<>(domainPageResponse.getCode(),  domainPageResponse.getMessage(), func.apply(domainPageResponse.getData()));
    }
}
